package com.cy.commom.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/** 在此切面中为对象做cache功能增强 */
//@Aspect
@Component
public class SysCacheAspect {
    //本次基于map对象作为Cache，存储数据库查询到的数据，
    private Map<String,Object> cache = new ConcurrentHashMap();//线程安全，HashMap线程不安全
    @Pointcut("bean(*ServiceImpl)")//这种写法会在正删改的时候也要执行此切面，不好
    public void doCache(){}



    @Around("doCache()")
    public Object doCacheAround(ProceedingJoinPoint pj)throws Throwable{
        //1、从缓存中取数据，假如有直接返回,如果没有查询数据库
        Object result = cache.get("cacheKey");
        if(result!=null) return result;
        //2、查询数据库
         result = pj.proceed();
        //3、将数据存储到缓存
         cache.put("cacheKey", result);
         return result;

    }

    /**
     * 当前应用程序存在的几个问题？
     * 1）key值设计（Key后续会动态生成）
     * 2）切入点的设计（缓存一般用于查询方法，增删改不需要）用@annotation不使用bean
     * 3）脏读问题（数据库中的数据已经被删除，但存储中还有）
     */
}
